run(const char* prog_name)
{
int argn;
- Format* ivecs = nullptr;
- Format* ovecs = nullptr;
+ Vecs::fmtinfo_t ivecs;
+ Vecs::fmtinfo_t ovecs;
Filter* filter = nullptr;
QString fname;
QString ofname;
case 'i':
argument = FETCH_OPTARG;
ivecs = Vecs::Instance().find_vec(argument);
- if (ivecs == nullptr) {
+ if (!ivecs) {
fatal("Input type '%s' not recognized\n", qPrintable(argument));
}
break;
case 'o':
- if (ivecs == nullptr) {
+ if (!ivecs) {
warning("-o appeared before -i. This is probably not what you want to do.\n");
}
argument = FETCH_OPTARG;
ovecs = Vecs::Instance().find_vec(argument);
- if (ovecs == nullptr) {
+ if (!ovecs) {
fatal("Output type '%s' not recognized\n", qPrintable(argument));
}
break;
if (fname.isEmpty()) {
fatal("No file or device name specified.\n");
}
- if (ivecs == nullptr) {
+ if (!ivecs) {
fatal("No valid input type specified\n");
}
if (global_opts.masked_objective & POSNDATAMASK) {
global_opts.masked_objective |= WPTDATAMASK;
}
- start_session(ivecs->get_name(), fname);
+ start_session(ivecs.fmtname, fname);
ivecs->rd_init(fname);
ivecs->read();
ivecs->rd_deinit();
}
/* reinitialize xcsv in case two formats that use xcsv were given */
- (void) Vecs::Instance().find_vec(ivecs->get_argstring());
+ Vecs::Instance().prepare_format(ivecs);
- start_session(ivecs->get_name(), qargs.at(0));
+ start_session(ivecs.fmtname, qargs.at(0));
ivecs->rd_init(qargs.at(0));
ivecs->read();
ivecs->rd_deinit();
if (qargs.size() == 2 && ovecs) {
/* reinitialize xcsv in case two formats that use xcsv were given */
- (void) Vecs::Instance().find_vec(ovecs->get_argstring());
+ Vecs::Instance().prepare_format(ovecs);
ovecs->wr_init(qargs.at(1));
ovecs->write();
usage(prog_name,0);
return 0;
}
- if (ovecs == nullptr) {
+ if (!ovecs) {
auto waypt_disp_lambda = [&fbOutput](const Waypoint* wpt)->void {
fbOutput.waypt_disp(wpt);
};
if (fname.isEmpty()) {
fatal("An input file (-f) must be specified.\n");
}
- start_session(ivecs->get_name(), fname);
+ start_session(ivecs.fmtname, fname);
ivecs->rd_position_init(fname);
if (global_opts.masked_objective & ~POSNDATAMASK) {
}
}
-Format* Vecs::find_vec(const QString& vecname)
+void Vecs::prepare_format(const fmtinfo_t& fmtdata) const
{
- QStringList options = vecname.split(',');
- if (options.isEmpty()) {
- fatal("A format name is required.\n");
- }
- const QString svecname = options.takeFirst();
+ QVector<arglist_t>* args = fmtdata->get_args();
- for (const auto& vec : d_ptr_->vec_list) {
- if (svecname.compare(vec.name, Qt::CaseInsensitive) != 0) {
- continue;
- }
+ validate_options(fmtdata.options, args, fmtdata.fmtname);
- QVector<arglist_t>* args = vec.vec->get_args();
-
- validate_options(options, args, vec.name);
-
- if (args && !args->isEmpty()) {
- assert(args->isDetached());
- for (auto& arg : *args) {
- if (!options.isEmpty()) {
- const QString opt = get_option(options, arg.argstring);
- if (!opt.isNull()) {
- assign_option(vec.name, &arg, opt);
- continue;
- }
- }
- QString qopt = inifile_readstr(global_opts.inifile, vec.name, arg.argstring);
- if (qopt.isNull()) {
- qopt = inifile_readstr(global_opts.inifile, "Common format settings", arg.argstring);
- }
- if (qopt.isNull()) {
- assign_option(vec.name, &arg, arg.defaultvalue);
- } else {
- assign_option(vec.name, &arg, qopt);
+ if (args && !args->isEmpty()) {
+ assert(args->isDetached());
+ for (auto& arg : *args) {
+ if (!fmtdata.options.isEmpty()) {
+ const QString opt = get_option(fmtdata.options, arg.argstring);
+ if (!opt.isNull()) {
+ assign_option(fmtdata.fmtname, &arg, opt);
+ continue;
}
}
+ QString qopt = inifile_readstr(global_opts.inifile, fmtdata.fmtname, arg.argstring);
+ if (qopt.isNull()) {
+ qopt = inifile_readstr(global_opts.inifile, "Common format settings", arg.argstring);
+ }
+ if (qopt.isNull()) {
+ assign_option(fmtdata.fmtname, &arg, arg.defaultvalue);
+ } else {
+ assign_option(fmtdata.fmtname, &arg, qopt);
+ }
}
+ }
- if (global_opts.debug_level >= 1) {
- disp_vec_options(vec.name, args);
- }
+ if (global_opts.debug_level >= 1) {
+ disp_vec_options(fmtdata.fmtname, args);
+ }
#if CSVFMTS_ENABLED
- /*
- * If this happens to be xcsv,style= and it was preceeded by an xcsv
- * format that utilized an internal style file, then we need to let
- * xcsv know the internal style file is no longer in play.
- */
- d_ptr_->xcsv_fmt.xcsv_setup_internal_style(nullptr);
+ /*
+ * For style based formats let xcsv know the style file. Otherwise
+ * make sure xcsv knows no style file is in use. This covers the case
+ * that we are processing xcsv,style= and it was preceeded by an xcsv
+ * format that utilized an internal style file.
+ */
+ d_ptr_->xcsv_fmt.xcsv_setup_internal_style(fmtdata.style_filename);
#endif // CSVFMTS_ENABLED
- vec.vec->set_name(vec.name); /* needed for session information */
- vec.vec->set_argstring(vecname); /* needed for positional parameters */
- return vec.vec;
+}
+Vecs::fmtinfo_t Vecs::find_vec(const QString& fmtargstring)
+{
+ QStringList options = fmtargstring.split(',');
+ if (options.isEmpty()) {
+ fatal("A format name is required.\n");
+ }
+ const QString fmtname = options.takeFirst();
+
+ for (const auto& vec : d_ptr_->vec_list) {
+ if (fmtname.compare(vec.name, Qt::CaseInsensitive) != 0) {
+ continue;
+ }
+
+ fmtinfo_t fmtinfo{vec.vec, vec.name, nullptr, options};
+ prepare_format(fmtinfo);
+ return fmtinfo;
}
/*
* is to search the list of xcsv styles.
*/
for (const auto& svec : qAsConst(style_list)) {
- if (svecname.compare(svec.name, Qt::CaseInsensitive) != 0) {
+ if (fmtname.compare(svec.name, Qt::CaseInsensitive) != 0) {
continue;
}
- QVector<arglist_t>* xcsv_args = d_ptr_->vec_list.at(0).vec->get_args();
-
- validate_options(options, xcsv_args, svec.name);
-
- if (xcsv_args && !xcsv_args->isEmpty()) {
- assert(xcsv_args->isDetached());
- for (auto& arg : *xcsv_args) {
- if (!options.isEmpty()) {
- const QString opt = get_option(options, arg.argstring);
- if (!opt.isNull()) {
- assign_option(svec.name, &arg, opt);
- continue;
- }
- }
- QString qopt = inifile_readstr(global_opts.inifile, svec.name, arg.argstring);
- if (qopt.isNull()) {
- qopt = inifile_readstr(global_opts.inifile, "Common format settings", arg.argstring);
- }
- if (qopt.isNull()) {
- assign_option(svec.name, &arg, arg.defaultvalue);
- } else {
- assign_option(svec.name, &arg, qopt);
- }
- }
- }
-
- if (global_opts.debug_level >= 1) {
- disp_vec_options(svec.name, xcsv_args);
- }
-#if CSVFMTS_ENABLED
- d_ptr_->xcsv_fmt.xcsv_setup_internal_style(svec.style_filename);
-#endif // CSVFMTS_ENABLED
-
- d_ptr_->vec_list[0].vec->set_name(svec.name); /* needed for session information */
- d_ptr_->vec_list[0].vec->set_argstring(vecname); /* needed for positional parameters */
- return d_ptr_->vec_list[0].vec;
+ fmtinfo_t fmtinfo{d_ptr_->vec_list.at(0).vec, svec.name, svec.style_filename, options};
+ prepare_format(fmtinfo);
+ return fmtinfo;
}
/*
* Not found.
*/
- return nullptr;
+ return {};
}
/*